class HouseItem:  # 家具类
    def __init__(self, name, area):  # 初始化方法，传入2个属性
        self.name = name
        self.area = area

    def __str__(self):
        return "[%s]占地%.2f" % (self.name, self.area)  #


class House:
    def __init__(self, house_type, area):
        self.house_type = house_type
        self.area = area
        # 剩余面积
        self.free_area = area
        # 家具列表
        self.item_list = []

    def __str__(self):
        return ("户型：%s\n总面积：%.2f[剩余： %.2f]\n家具：%s"
                % (self.house_type, self.area, self.free_area, self.item_list))

    def add_item(self, item):  # bed=item
        print("要添加 %s" % item)
        # 1、判断家具的面积
        if item.area > self.free_area:
            print("%s的面积太大了，无法添加" % item.name)
            return
        # 2、将家具的名称添加到列表中
        self.item_list.append(item.name)
        # 3、计算剩余面积
        self.free_area -= item.area


# 创建家具对象
bed = HouseItem("席梦思", 20)
chest = HouseItem("衣柜", 20)
table = HouseItem("餐桌", 3)
print(bed)  # 使用描述方法会自动调用__str__,可以直接描述bed对象
print(chest)  # 使用描述方法__str__
print(table)  # 使用描述方法__str__

# 创建房子对象
my_home = House("两室一厅", 60)

# 调用三次add_item方法，将三件家具以实参传递到add_item内部
my_home.add_item(bed)  # bed 有2个属性name、area，同样也会传递进房子类中
my_home.add_item(chest)   # 对象套用对象 my_home对象套用chest
my_home.add_item(table)

print(my_home)  # 使用描述方法会自动调用__str__,可以直接描述my_home对象
